# 爬取猫眼电影中榜单栏目中TOP100榜的所有电影信息（10页信息全部爬取），字段要求【序号、图片、电影名称、主演、时间、评分】，并将信息写入文件中
# 第七周作业3)
# 班级：Python五期
# 学员：李子坚

from requests.exceptions import RequestException
import requests
import re,time,json
import os

def mkdir(path):
    '''创建文件夹'''
    #去除首位空格
    path=path.strip()
    #去除尾部 \ 符号
    path=path.rstrip("\\")
 
    #判断路径是否存在，如果不存在则创建文件夹
    if not os.path.exists(path):
        os.makedirs(path)
        
def getPage(url):
    '''爬取指定url页面信息'''
    try:
        #定义请求头信息
        headers = {
            'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'
        }
        # 执行爬取
        res = requests.get(url,headers=headers)
        #判断响应状态,并响应爬取内容
        if res.status_code == 200:
            return res.text
        else:
            return None
    except RequestException:
        return None

def parsePage(html):
    '''解析爬取网页中的内容，并返回字段结果'''
    #定义解析正则表达式
    pat = '<i class="board-index board-index-[0-9]+">([0-9]+)</i>.*?<img data-src="(.*?)" alt="(.*?)" class="board-img" />.*?<p class="star">(.*?)</p>.*?<p class="releasetime">(.*?)</p>.*?<i class="integer">([0-9\.]+)</i><i class="fraction">([0-9]+)</i>'
    #执行解析
    items = re.findall(pat,html,re.S)
    #遍历封装数据并返回
    for item in items:
        #下载电影图片
        path = os.path.join("./maoyanimg", item[2]+".jpg")
        downloadImg(item[1],path)

        yield "{:>4}  {:<90}{:<16}{:<32}{:<18}{:>6}".format(item[0],item[1],item[2],item[3].strip()[3:],item[4].strip()[5:],item[5]+item[6])
        
        '''yield {
            'index':item[0],
            'image':item[1],
            'title':item[2],
            'actor':item[3].strip()[3:],
            'time':item[4].strip()[5:],
            'score':item[5]+item[6],
        }'''

def downloadImg(image_url,file_path):
    '''根据url下载图片文件'''
    #创建response对象
    #print(image_url)
    res = requests.get(image_url) 

    #下载图片文件
    with open(file_path,'wb') as f:
        f.write(res.content)
    
def writeFile(content):
    '''执行文件追加写操作'''
    #print(content)
    with open("./maoyanresult.txt",'a',encoding='utf-8') as f:
        f.write(json.dumps(content,ensure_ascii=False).replace("\"","") + "\n")
        #json.dumps 序列化时对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii=False

def main(offset):
    ''' 主程序函数，负责调度执行爬虫处理 '''
    url = 'http://maoyan.com/board/4?offset=' + str(offset)
    html = getPage(url)

    try:
        #判断是否爬取到数据，并调用解析函数
        if html:
            #爬取内容逐行输出到文件
            for item in parsePage(html):
                #逐行输出TOP100榜单电影信息
                writeFile(item)
    except Exception as e:
        if hasattr(e,'reason'):
            print(e.reason)

        if hasattr(e,'code'):
            print(e.code)

# 判断当前执行是否为主程序运行，并遍历调用主函数爬取数据
if __name__ == '__main__':
    print("亲，正在下载猫眼电影TOP100榜的电影图片和电影信息，请稍候……")

    #创建存放电影图片文件夹
    mkdir("./maoyanimg")
    #输出标题行
    writeFile("{:<4}{:<88}{:<16}{:<40}{:<18}{:<6}".format("排名","图片","电影名称","主演","时间","评分"))

    #爬取猫眼电影中榜单栏目中TOP100榜的所有电影信息
    for i in range(10):
        main(offset=i*10)
        time.sleep(1)

    print("=======猫眼电影TOP100榜的电影图片和电影信息下载完成！=======")
    print("请查看电影信息文件<maoyanresult.txt>和图片文件夹<maoyanimg>!")
